home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_200
/
260_01
/
rbsb.c
< prev
next >
Wrap
Text File
|
1988-02-23
|
16KB
|
449 lines
/*
*
* -rev 01-01-87
* This file contains Unix specific stuff for setting terminal modes,
* very little is specific to ZMODEM or YMODEM per se (that stuff is in
* sz.c and rz.c). The CRC-16 routines used by XMODEM, YMODEM, and ZMODEM
* are also in this file, an iterative version, and a fast table driven macro
* version, selected by #define CRCTABLE
*
* This file is #included so the main file can set parameters such as HOWMANY.
* See the main files (rz.c/sz.c) for compile instructions.
*/
#ifdef MSDOS
#include <sys/types.h>
#include <sys/stat.h>
#include <tty.h>
#define OS "MS-DOS"
#endif
#ifdef V7
#include <sys/types.h>
#include <sys/stat.h>
#include <sgtty.h>
#define OS "V7/BSD"
#endif
#ifndef OS
#ifndef USG
#define USG
#endif
#endif
#ifdef USG
#include <sys/types.h>
#include <sys/stat.h>
#include <termio.h>
#include <sys/ioctl.h>
#define OS "SYS III/V"
#endif
#if HOWMANY > 255
Howmany must be 255 or less
#endif
struct
{
unsigned baudr;
int speedcode;
}
speeds[] =
{
110, B110,
300, B300,
600, B600,
1200, B1200,
2400, B2400,
4800, B4800,
9600, B9600,
19200, EXTA,
9600, EXTB,
0,
};
int Twostop; /* Use two stop bits */
unsigned getspeed(code)
int code;
{
int n;
for (n = 0; speeds[n].baudr; ++n)
#ifndef MSDOS
if (speeds[n].speedcode == code)
return(speeds[n].baudr);
return(0);
#else
if (speeds[n].baudr == code)
return(speeds[n].speedcode);
return(-1);
#endif
}
#ifndef MSDOS
#ifdef ICANON
struct termio oldtty, tty;
#else
struct sgttyb oldtty, tty;
struct tchars oldtch, tch;
#endif
int iofd = 0; /* File descriptor for ioctls & reads */
#else /* MSDOS */
int iofd = -1;
int speed = B1200;
char *port = "COM1";
#endif
/*
* mode(n)
* 2: set a cbreak, XON/XOFF control mode if using Pro-YAM's -g option
* 1: save old tty stat, set raw mode
* 0: restore original tty mode
*/
mode(n)
{
static did0 = FALSE;
vfile("mode:%d", n);
switch (n)
{
#ifdef USG
case 2: /* Cbreak mode used by sb when -g detected */
if (!did0)
(void) ioctl(iofd, TCGETA, &oldtty);
tty = oldtty;
tty.c_iflag = BRKINT|IXON;
tty.c_oflag = 0; /* Transparent output */
tty.c_cflag &= ~PARENB; /* Disable parity */
tty.c_cflagc |= CS8; /* Set character size = 8 */
if (Twostop)
tty.c_cflag |= CSTOPB; /* Set two stop bits */
#ifdef XCLUDE
tty.c_lflag = XCLUDE | ISIG;
#else
tty.c_lflag = ISIG;
#endif
tty.c_cc[VINTR] = Zmodem ? 03:030; /* Interrupt char */
tty.c_cc[VMIN] = 1;
(void) ioctl(iofd, TCSETAW, &tty);
did0 = TRUE;
return(OK);
case 1:
if (!did0)
(void) ioctl(iofd, TCGETA, &oldtty);
tty = oldtty;
tty.c_iflag = IGNBRK;
/* No echo, crlf mapping, INTR, QUIT, delays, no erase/kill */
tty.c_lflag &= ~(ECHO | ICANON | ISIG);
#ifdef XCLUDE
tty.c_lflag |= XCLUDE;
#endif
tty.c_oflag = 0; /* Transparent output */
tty.c_cflag &= ~PARENB; /* Same baud rate, disable parity */
tty.c_cflag |= CS8; /* Set character size = 8 */
if (Twostop)
tty.c_cflag |= CSTOPB; /* Set two stop bits */
tty.c_cc[VMIN] = HOWMANY; /* This many chars satisfies reads */
tty.c_cc[VTIME] = 1; /* or in this many tenths of seconds */
(void) ioctl(iofd, TCSETAW, &tty);
did0 = TRUE;
Baudrate = getspeed(tty.c_cflag & CBAUD);
return(OK);
#endif
#ifdef V7
case 2: /* This doesn't work ... */
printf("No mode(2) in V7/BSD!");
bibi(99);
if (!did0)
{
ioctl(iofd, TIOCEXCL, 0);
ioctl(iofd, TIOCGETP, &oldtty);
ioctl(iofd, TIOCGETC, &oldtch);
}
tty = oldtty;
tch = oldtch;
tch.t_intrc = Zmodem ? 03:030; /* Interrupt char */
tty.sg_flags |= (ODDP|EVENP|CBREAK);
tty.sg_flags &= ~(ALLDELAY|CRMOD|ECHO|LCASE);
ioctl(iofd, TIOCSETP, &tty);
ioctl(iofd, TIOCSETC, &tch);
did0 = TRUE;
return(OK);
case 1:
if (!did0)
{
ioctl(iofd, TIOCEXCL, 0);
ioctl(iofd, TIOCGETP, &oldtty);
ioctl(iofd, TIOCGETC, &oldtch);
}
tty = oldtty;
tty.sg_flags |= RAW;
tty.sg_flags &= ~ECHO;
ioctl(iofd, TIOCSETP, &tty);
did0 = TRUE;
Baudrate = getspeed(tty.sg_ospeed);
return(OK);
#endif
#ifdef MSDOS
case 2: /* This doesn't work ... */
printf("No mode(2) in MSDOS");
bibi(99);
case 1:
if (!did0)
iofd = tty_open(port, speed | CS8);
did0 = TRUE;
return(OK);
#endif
case 0:
if (!did0)
return(ERROR);
#ifdef USG
(void) ioctl(iofd, TCSBRK, 1); /* Wait for output to drain */
(void) ioctl(iofd, TCFLSH, 1); /* Flush input queue */
(void) ioctl(iofd, TCSETAW, &oldtty); /* Restore original modes */
(void) ioctl(iofd, TCXONC,1); /* Restart output */
#endif
#ifdef V7
ioctl(iofd, TIOCSETP, &oldtty);
ioctl(iofd, TIOCSETC, &oldtch);
ioctl(iofd, TIOCNXCL, 0);
#endif
#ifdef MSDOS
tty_close(iofd);
#endif
return(OK);
default:
return(ERROR);
}
}
sendbrk()
{
#ifdef V7
#ifdef TIOCSBRK
#define CANBREAK
sleep(1);
ioctl(iofd, TIOCSBRK, 0);
sleep(1);
ioctl(iofd, TIOCCBRK, 0);
#endif
#endif
#ifdef USG
#define CANBREAK
ioctl(iofd, TCSBRK, 0);
#endif
#ifdef MSDOS
#define CANBREAK
_combrk(iofd);
#endif
}
#ifdef FIONREAD
#define READCHECK
/*
* Return non 0 iff something to read from io descriptor f
*/
rdchk(f)
{
static long lf;
ioctl(f, FIONREAD, &lf);
return ((int) lf);
}
#endif
#ifdef SVR2
#define READCHECK
#include <fcntl.h>
char checked = '\0' ;
/*
* Nonblocking I/O is a bit different in System V, Release 2
*/
rdchk(f)
{
int lf, savestat = fcntl(f, F_GETFL) ;
fcntl(f, F_SETFL, savestat | O_NDELAY) ;
lf = read(f, &checked, 1) ;
fcntl(f, F_SETFL, savestat) ;
return(lf) ;
}
#endif
#ifdef CRCTABLE
/* crctab calculated by Mark G. Mendel, Network Systems Corporation */
static unsigned short crctab[256] =
{
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c